import Config from './config'
import Constant from './constant'
import Util from './util'
import http from './request'

let DbUtil = {
  WS_URL: 'http://127.0.0.1:8080/ptmo/services/ptmo/v1/',
  TIME_OUT: 30000,
  REQUEST_POST: 'post',
  REQ_DATA_TYPE: 'json',

  /**
     * 单条SQL语句执行
     * @dbName  ptmo.db
     * @param sql 要执行的SQL语句
     * @param prarmOfSql ？对应的参数
     * @param sucess 成功回调
     * @param fail   失败回调
     */
  execOneSql: function (sql, prarmOfSql, sucess, fail) {
    // 浏览器调用接口
    var prarm = JSON.parse(JSON.stringify(prarmOfSql))
    if (prarm != null) {
      // 将JSON对象转换为字符串
      prarm.forEach((elOfFirstLevel, i) => {
        if (elOfFirstLevel instanceof Array) {
          // 如果为数组，则对数组元素依次进行判断
          prarm[i] = JSON.stringify(elOfFirstLevel)
        } else if (typeof (elOfFirstLevel) === 'object') {
          // 如果不是数组，则判断是否为JSON，如果是则转换
          prarm[i] = JSON.stringify(elOfFirstLevel)
        }
      })
    }

    if (Util.baseUtil.isPcOrMobile() === Constant.PTMO_PUBLIC_SORT.RUN_ENV.PC) {
      // 浏览器调试用
      var obj = {
        method: 'execOneSql',
        data: {
          sql: sql, // sql语句
          param: prarm // 参数
        }
      }

      DbUtil.httpRequest(obj, sucess, fail)
    } else {
      document.addEventListener('deviceready', function () {
        console.log('liulizhi--sqlitePlugin：' + window.sqlitePlugin) //, androidOldDatabaseImplementation: true 
        var db = window.sqlitePlugin.openDatabase({ name: 'PTMO.db', location: 'default'})
        var callFail = function (tx, res) {
          console.log('error' + JSON.stringify(res))
          // 修改批量操作时，某条数据执行错误时，给出提示，并且继续执行下面的sql
          fail(tx, res)
        }
        db.transaction(function (tx) {
          tx.executeSql(sql, prarm, sucess, callFail)
        })
      }, false)
    }
  },
  /**
     *  批量执行插入和更行，删除操作，成功失败回调对应的函数。
     *  SQLS,个数要跟params的个数一致。
     *  params[i]=[1,2,3,..]
     * @param dbName 数据库名 PTMO.db
     * @param sqls 批量SQL语句
     * @param paramsOfSqls 对应的SQL参数
     * @param sucess 成功
     * @param fail  失败
     */
  execBatchSql: function (sqls, paramsOfSqls, sucess, fail) {
    // 将JSON对象转换为字符串
    var params = JSON.parse(JSON.stringify(paramsOfSqls))
    if (params != null) {
      params.forEach((elOfFirstLevel, i) => {
        if (elOfFirstLevel instanceof Array) {
          // 如果为数组，则对数组元素依次进行判断
          elOfFirstLevel.forEach((elOfSecondLevel, j) => {
            if (typeof (elOfSecondLevel) === 'object') {
              params[i][j] = JSON.stringify(elOfSecondLevel)
            }
          })
        } else if (typeof (elOfFirstLevel) === 'object') {
          // 如果不是数组，则判断是否为JSON，如果是则转换
          params[i] = JSON.stringify(elOfFirstLevel)
        }
      })
    }

    if (Util.baseUtil.isPcOrMobile() === Constant.PTMO_PUBLIC_SORT.RUN_ENV.PC) {
      // 浏览器调试用
      var obj = {
        method: 'execBatchSql',
        data: {
          sql: sqls, // sql语句
          param: params // 参数
        }
      }
      console.log(obj.data.sql)
      DbUtil.httpRequest(obj, sucess, fail)
    } else {
      document.addEventListener('deviceready', function () {
        console.log('liulizhi--sqlitePlugin：' + window.sqlitePlugin) //, androidOldDatabaseImplementation: true 
        var db = window.sqlitePlugin.openDatabase({ name: 'PTMO.db', location: 'default'})
        var len = sqls.length
        if (len === 0) {
          sucess(null, '')
        } else {
          var execSqls = []
          for (var i = 0; i < sqls.length; i++) {
            execSqls.push([sqls[i], params[i]])
          }
          db.sqlBatch(execSqls, sucess, function (tx, res) {
            // 修改批量操作时，某条数据执行错误时，给出提示，并且继续执行下面的sql
            fail(tx, res)
          })
        }
      }, false)
    }
  },
  publicSort: function () {
    /*  如果是在电脑中运行，并且是开发模式： 则使用本地在线数据库
        如果是在电脑中运行，并且是联调模式：
        则使用服务器在线数据库
        如果是在电脑中运行，并且是发布模式：
        则提示“在PC中应用不能以发布模式运行。
    */
    if (Config.RUN_MODEL === Constant.PTMO_PUBLIC_SORT.RUN_ENV_TYPE.DEVELOP) {
      DbUtil.WS_URL = 'http://127.0.0.1:8080/ptmo/services/ptmo/v1/'
    } else if (Config.RUN_MODEL === Constant.PTMO_PUBLIC_SORT.RUN_ENV_TYPE.DEBUG) {
      DbUtil.WS_URL = 'http://26.47.136.191:8888/ptmo/services/ptmo/v1/'
    } else if (Config.RUN_MODEL === Constant.PTMO_PUBLIC_SORT.RUN_ENV_TYPE.PUBLISH) {
      this.$toast('在PC中应用不能以发布模式运行')
    }
  },
  httpRequest: function (obj, successFn, errorFn) {
    DbUtil.publicSort()
    http.post(DbUtil.WS_URL + obj.method, JSON.stringify(obj.data), {
      contentType: 'application/json',
      dataType: 'text',
      timeout: DbUtil.TIME_OUT
    }).then(result => {
      var tx = void 0
      var saveres
      var res = void 0
      saveres = void 0
      result = JSON.stringify(result)
      if (result.indexOf('errorMsg') >= 0) {
        result = JSON.parse(result)
        return errorFn(tx, result)
      } else {
        result = JSON.parse(result)
        saveres = result
        // 开始重组新的返回json格式
        res = {
          rows: {
            item: function (i) {
              return saveres.rows.item[i]
            },
            length: saveres.length
          },
          rowsAffected: saveres.rowsAffected,
          insertId: saveres.insertId || null
        }
        console.log(JSON.stringify(res))
        return successFn(tx, res)
      }
    }).catch(err => {
      console.log('方法：' + obj.method + '返回失败.' + JSON.stringify(err))
      errorFn(err)
    })
  }
}

export default DbUtil
